package com.atguigu.wulaoshi

object $02_Lambda {
  def main(args: Array[String]): Unit = {
   // (name: String) =>  println(name)
      //匿名函数用变量来接收,该变量是String=>Unit函数类型
      val fun = (name: String) =>println(name)
      fun("atguigu")
      //定义一个函数,以函数作为参数输入
      def f(func: String => Unit): Unit = {
        func("atguigu")
      }
      //调用:把要干的事,操作,规则作为一个函数传进来,而数据写死在里面;定死数据,传入操作
       f(fun)
       f((name: String) =>println(name))//传入匿名函数(lambda表达式)
    //匿名函数的简化原则
    //(1)参数的类型可以省略,会根据形参进行自动的推导
    f((name) =>println(name))
    //(2)类型省略后,如果发现只有一个参数,圆括号可以省略
    f(name =>println(name))
    //(3)匿名函数如果只有一行,大括号可以省略
    f(name =>println(name))
    //(4)如果参数只出现一次,参数省略且后面参数可以用_代替
    f(println(_))
    //(5)如果可以推断出当前传入的println是一个函数体,而不是调用语句,可以直接省略下划线
    f(println)//作为一个函数本身传进来

    //定义一个"二元运算"函数,只操作1和2两个数,但是具体运算通过参数传入
    def dualFunctionOneAndTwo(fun:(Int,Int)=>Int):Int={
      fun(1,2)
    }
    val add = (x:Int,y:Int)=>x+y
    dualFunctionOneAndTwo(add)

    dualFunctionOneAndTwo((x:Int,y:Int)=>x+y)
    dualFunctionOneAndTwo((x,y)=>x+y)
    dualFunctionOneAndTwo(_+_)
    dualFunctionOneAndTwo(_-_)
  }

}
